home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 70 / Mac Magazin CD 70.iso / macware / MacGhostView Folder / lib / gs_type1.ps < prev    next >
Encoding:
Text File  |  2000-03-26  |  5.5 KB  |  154 lines  |  [TEXT/R*ch]

  1. %    Copyright (C) 1994, 2000 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % $Id: gs_type1.ps,v 1.2 2000/03/10 03:37:14 lpd Exp $
  16. % Type 1 font support code.
  17.  
  18. % The standard representation for PostScript compatible fonts is described
  19. % in the book "Adobe Type 1 Font Format", published by Adobe Systems Inc.
  20.  
  21. % Define an augmented version of .buildfont1 that inserts UnderlinePosition
  22. % and UnderlineThickness entries in FontInfo if they aren't there already.
  23. % (This works around the incorrect assumption, made by many word processors,
  24. % that these entries are present in the built-in fonts.)
  25. /.buildfont1
  26.  { dup /FontInfo known not
  27.     { .growfontdict dup /FontInfo 2 dict put }
  28.    if
  29.    dup dup /FontInfo get dup dup
  30.    /UnderlinePosition known exch /UnderlineThickness known and
  31.     { pop pop        % entries already present
  32.     }
  33.     { dup length 2 add dict .copydict
  34.       dup /UnderlinePosition known not
  35.        { dup /UnderlinePosition 3 index /FontBBox .knownget
  36.           { 1 get 2 div }            % 1/2 the font descent
  37.       { -100 } ifelse put
  38.        }
  39.       if
  40.       dup /UnderlineThickness known not
  41.        { dup /UnderlineThickness 3 index /FontBBox .knownget
  42.           { dup 3 get exch 1 get sub 20 div }    % 1/20 the font height
  43.       { 50 } ifelse put
  44.        }
  45.       if
  46.       1 index /FontInfo get wcheck not { readonly } if
  47.       /FontInfo exch put
  48.     }
  49.    ifelse //.buildfont1
  50.  } bind def
  51. % If the diskfont feature isn't included, define a dummy .loadfontdict.
  52. /.loadfontdict where
  53.  { pop }
  54.  { /.loadfontdict 0 dict readonly def }
  55. ifelse
  56. /.loadfontfile        % <file> .loadfontfile -
  57.  { mark exch
  58.    DISKFONTS { .loadfontdict begin } if
  59.     % In order to load fonts reliably, we should push systemdict
  60.     % here.  However, Ed Taft says that Adobe implementations
  61.     % push userdict and nothing else!
  62.     % We really would just like systemdict on the stack,
  63.     % but fonts produced by Fontographer require a writable dictionary.
  64.     % However, we can't use any of the other well-known dictionaries
  65.     % (such as userdict), since the whole point of pushing systemdict
  66.     % is to make sure that nothing important has been redefined.
  67.    userdict begin
  68.     % We can't just use `run', because we want to check for .PFB files.
  69.    currentpacking
  70.     { false setpacking .loadfont1 true setpacking }
  71.     { .loadfont1 }
  72.    ifelse end
  73.     { stop } if
  74.    DISKFONTS { end } if
  75.    cleartomark
  76.  } bind def
  77. /.loadfont1 {        % <file> .loadfont1 <errorflag>
  78.   {    % We would like to use `false /PFBDecode filter',
  79.     % but this occasionally produces a whitespace character as
  80.     % the first of an eexec section, so we can't do it.
  81.     % Also, since the real input file never reaches EOF if we are using
  82.     % a PFBDecode filter (the filter stops just after reading the last
  83.     % character), we must explicitly close the real file in this case.
  84.     % Since the file might leave garbage on the operand stack,
  85.     % we have to create a procedure to close the file reliably.
  86.     dup read not { -1 } if
  87.     2 copy unread 16#80 eq {
  88.     dup true /PFBDecode filter cvx
  89.     exch .currentresourcefile eq {
  90.       dup /.execasresource .systemvar
  91.     } {
  92.       {exec}
  93.     } ifelse
  94.     2 index cvlit
  95.     /closefile .systemvar 3 .execn
  96.       } {
  97.     cvx exec
  98.     } ifelse
  99.   } stopped
  100. } bind def
  101.  
  102. % Here are the BuildChar and BuildGlyph implementation for Type 1 fonts.
  103. % The names %Type1BuildChar and %Type1BuildGlyph are known to the interpreter.
  104. % The real work is done in an operator:
  105. %    <font> <code|name> <name> <charstring> .type1execchar -
  106.  
  107. (%Type1BuildChar)  cvn {    % <font> <code> %Type1BuildChar -
  108.   1 index /Encoding get 1 index get .type1build .type1execchar
  109. } bind def
  110. (%Type1BuildGlyph) cvn {    % <font> <name> %Type1BuildGlyph -
  111.   dup .type1build .type1execchar
  112. } bind def
  113. % Note: this procedure is used for both Type 1 and Type 2 fonts.
  114. /.type1build {        % <font> <code|name> <name> .type1build
  115.             %   <font> <code|name> <name> <charstring>
  116.   2 index begin
  117.     dup CharStrings exch .knownget not {
  118.       2 copy eq { exch pop /.notdef exch } if
  119.        QUIET not
  120.     { (Substituting .notdef for ) print = flush }
  121.     { pop }
  122.        ifelse
  123.        /.notdef CharStrings /.notdef get
  124.     } if
  125.   end
  126. } bind def
  127. % CCRun is an undocumented procedure provided for Type 4 fonts.
  128. 1183615869 internaldict begin
  129. /CCRun {    % <font> <code|name> <charstring> CCRun -
  130.   1 index dup type /integertype eq {
  131.     3 index /Encoding get exch get
  132.   } if exch .type1execchar
  133. } bind def
  134. end
  135.  
  136. % Register the font types for definefont.
  137. buildfontdict 1 /.buildfont1 cvx put
  138. buildfontdict 4 /.buildfont4 cvx put
  139.  
  140. % Add Type 2 support if applicable.
  141. /.buildfont2 where not { (%END2) .skipeof } if
  142. pop
  143. (%Type2BuildChar)  cvn {    % <font> <code> %Type2BuildChar -
  144.   1 index /Encoding get 1 index get .type1build .type2execchar
  145. } bind def
  146. (%Type2BuildGlyph) cvn {    % <font> <name> %Type2BuildGlyph -
  147.   dup .type1build .type2execchar
  148. } bind def
  149. buildfontdict 2 /.buildfont2 cvx put
  150. %END2
  151.